/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ec.edu.ucuenca.pagina_asos.uimanager;

import ec.edu.ucuenca.pagina_asos.controller.EscuelaJpaController;
import ec.edu.ucuenca.pagina_asos.controller.UsuarioJpaController;
import ec.edu.ucuenca.pagina_asos.controller.exceptions.CreacionUsuarioException;
import ec.edu.ucuenca.pagina_asos.controller.exceptions.EnvioMailException;
import ec.edu.ucuenca.pagina_asos.controller.exceptions.UsuarioExistenteException;
import ec.edu.ucuenca.pagina_asos.entity.Escuela;
import ec.edu.ucuenca.pagina_asos.entity.Persona;
import ec.edu.ucuenca.pagina_asos.entity.Usuario;
import ec.edu.ucuenca.pagina_asos.uimanager.util.JsfUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;

/*
String viewId = facesContext.getViewRoot().getViewId();
#{view.viewId}
String uri = ((HttpServletRequest) externalContext.getRequest()).getRequestURI();
#{request.requestURI}
*/
/**
 *
 * @author Marcelo
 */
@ManagedBean
@SessionScoped
public class GestorUsuario implements Serializable {

    private Usuario usuarioActual;

    private Persona persona = new Persona();
    
    private Escuela escuelaSeleccionada;

    private String strUsuario;
    private String strPassword;
    private String strEmail;
    private String prueba;
    private String currentUrl;
    private final UsuarioJpaController usuarioController = new UsuarioJpaController();
    private final EscuelaJpaController escuelaController = new EscuelaJpaController();
    
    private List<Escuela> escuelas = new ArrayList<Escuela>();

    public static GestorUsuario getInstance() {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{gestorUsuario}", GestorUsuario.class);
        return (GestorUsuario) ex.getValue(context);
    }

    /**
     * Creates a new instance of GestorUsuario
     */
    public GestorUsuario() {
    }

    public boolean estaLogeado() {
        return usuarioActual != null
                && usuarioActual.getNombre() != null && !usuarioActual.getNombre().isEmpty()
                && usuarioActual.getClave() != null && !usuarioActual.getClave().isEmpty();
    }

    public String cargarEscuelas() {
        escuelas = escuelaController.findEscuelaEntities(true, -1, -1);
        return "";
    }
    
    public String registrar() {

        persona.setId(null);
        
        if (strUsuario.isEmpty() || !strUsuario.matches("[-a-zA-Z0-9_]{4,}")) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "El nombre de usuario solo debe tener caracteres de contengan a-z, números ó el caracter _ y mínimo 4 caracteres"));
            return "";            
        }
        
        if (strEmail.isEmpty() || !strEmail.matches("[-0-9a-zA-Z.+_]+@[-0-9a-zA-Z.+_]+\\.[a-zA-Z]{2,4}")) {            
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "El e-mail tiene un formato incorrecto"));
            return "";
        }
        if (strPassword.isEmpty()) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Se debe ingresar una contraseña"));
            return "";
        }
        if (strUsuario.isEmpty()) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Se debe ingresar el usuario"));
            return "";
        }
        if (escuelaSeleccionada == null) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Se debe seleccionar una escuela"));
            return "";
        }
        
        try {
            usuarioController.registrarUsuario(strUsuario, strPassword, strEmail, persona, escuelaSeleccionada);
            
            GestorPrincipal.getInstance().setMensaje("Usuario creado, por favor, revise su correo electrónico para la activación de su cuenta");
            
            persona = new Persona();
            
            return GestorPrincipal.getInstance().mensajesRedir();
        } catch (UsuarioExistenteException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Error al procesar el registro"));
        } catch (EnvioMailException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Error al procesar el registro"));
        } catch (CreacionUsuarioException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Error al procesar el registro"));
        }
        
        return "";
    }

    public String logout() {
        usuarioActual = new Usuario();
        strUsuario = "";
        strPassword = "";
        RequestContext.getCurrentInstance().update("frmLeft");
        return "index";
    }

    public String login() {
        String direccionPrincipal = FacesContext.getCurrentInstance().getExternalContext().getRequestServerName();
        currentUrl = direccionPrincipal.split("\\.")[0];

        Usuario usuario = usuarioController.findUsuario(strUsuario, strPassword);

        if (usuario != null) {
            if (usuario.getTokenRegistro() == null || usuario.getTokenRegistro().isEmpty()) {
                usuarioActual = usuario;
                //FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Login correcto."));
                if (usuarioActual.getEstado() == 1) {
                    JsfUtil.addErrorMessage("ERROR", "El usuario tiene prohibido el acceso. Consulte al administrador para mayor información.");
                    usuarioActual = new Usuario();
                    return "";
                }
                if (usuarioActual.getPersona() != null) {
                    Escuela escuelaDeLogeado = usuarioActual.getPersona().getEscuela();
                    if (escuelaDeLogeado != null) {
                        GestorPrincipal.getInstance().setEscuela(escuelaDeLogeado);
                    }
                }
                if (usuarioActual.getTipo() == Usuario.TipoUsuario.ADMIN) {
                    return "backend/FrmNoticias?faces-redirect=true";
                }
                RequestContext.getCurrentInstance().update("frmLeft");
            } else {
                JsfUtil.addErrorMessage("ERROR", "La cuenta aún no ha sido activada.");
            }
        } else {
            JsfUtil.addErrorMessage("ERROR", "Usuario o contraseña inválidos");
        }

        return "";
    }

    public String registroRedir() {
        GestorUsuario.getInstance().setPersona(new Persona());
        cargarEscuelas();
        return "registro?faces-redirect=true";
    }

    public String pruebaBoton() {
        prueba = "nuevo texto";

        Usuario u = new Usuario();
        u.setNombre("nom");
        u.setClave("cl");

        try {
            usuarioController.create(u);
            System.out.println("creado");
        } catch (Exception ex) {
            Logger.getLogger(GestorUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "";
    }

    public String getPrueba() {
        return prueba;
    }

    public void setPrueba(String prueba) {
        this.prueba = prueba;
    }

    public Usuario getUsuarioActual() {
        return usuarioActual;
    }

    public void setUsuarioActual(Usuario usuarioActual) {
        this.usuarioActual = usuarioActual;
    }

    public String getStrUsuario() {
        return strUsuario;
    }

    public void setStrUsuario(String strUsuario) {
        this.strUsuario = strUsuario;
    }

    public String getStrPassword() {
        return strPassword;
    }

    public void setStrPassword(String strPassword) {
        this.strPassword = strPassword;
    }

    public String getStrEmail() {
        return strEmail;
    }

    public void setStrEmail(String strEmail) {
        this.strEmail = strEmail;
    }

    public String getCurrentUrl() {
        return currentUrl;
    }

    public void setCurrentUrl(String currentUrl) {
        this.currentUrl = currentUrl;
    }

    public Persona getPersona() {
        return persona;
    }

    public void setPersona(Persona persona) {
        this.persona = persona;
    }

    public List<Escuela> getEscuelas() {
        return escuelas;
    }

    public void setEscuelas(List<Escuela> escuelas) {
        this.escuelas = escuelas;
    }

    public Escuela getEscuelaSeleccionada() {
        return escuelaSeleccionada;
    }
    public void setEscuelaSeleccionada(Escuela escuelaSeleccionada) {
        this.escuelaSeleccionada = escuelaSeleccionada;
    }
    public boolean getEsAdministrador()
    {
        return this.estaLogeado() && usuarioActual.getTipo().equals(Usuario.TipoUsuario.ADMIN);
    }
}
